import { ipcMain, dialog } from 'electron'
import axios from 'axios'
import Store from 'electron-store'
import { log } from 'node:console'
const store = new Store()
const config = {
  // 默认地址请求地址，可在 .env.** 文件中修改
  baseURL: '/',
  // 设置超时时间
  timeout: 5000,
  // 跨域时候允许携带凭证
  withCredentials: true
}

class RequestHttp {
  service
  constructor(config) {
    // instantiation
    this.service = axios.create(config)

    /**
     * @description 请求拦截器
     * 客户端发送请求 -> [请求拦截器] -> 服务器
     * token校验(JWT) : 接受服务器返回的 token,存储到 vuex/pinia/本地储存当中
     */
    this.service.interceptors.request.use(
      (config) => {
        const userInfo = store.get('user-info')
        if (userInfo) {
          config.headers['authorization'] = userInfo.token || ''
        }
        return config
      },
      (error) => {
        return Promise.reject(error)
      }
    )

    /**
     * @description 响应拦截器
     *  服务器换返回信息 -> [拦截统一处理] -> 客户端JS获取到信息
     */
    this.service.interceptors.response.use(
      (response) => {
        const { data } = response

        // // token失效
        // if (data.code === 500) {
        //   store.clear()
        //   // 通知所有渲染进程 token 失效
        //   BrowserWindow.getAllWindows().forEach(win => {
        //     win.webContents.send('checkStatus')
        //   })
        //   return
        // }
        // // 登录失效
        // if (data.code == 401) {
        //   // router.replace('/login')
        //   return data
        // }
        // 全局错误信息拦截（防止下载文件的时候返回数据流，没有 code 直接报错）
        if (data.code && data.code !== 200) {
          ipcMain.emit('CHANGE-STATUS', data)
        }
        // 成功请求（在页面上除非特殊情况，否则不用处理失败逻辑）
        return data
      },
      async (error) => {
        console.log(1111111111, error.message);
        // 请求超时 && 网络错误单独判断，没有 response
        if (error.message.indexOf('timeout') !== -1)
          dialog.showErrorBox('警告', '请求超时！请您稍后重试')
        if (error.message.indexOf('ENETUNREACH') !== -1)
          dialog.showErrorBox('警告', '网络错误！请您稍后重试')
        return Promise.reject(error)
      }
    )
  }

  /**
   * @description 常用请求方法封装
   */
  get(url, params, _object = {}) {
    return this.service.get(url, { params, ..._object })
  }
  get2(url, params, _object = {}) {
    return this.service.get(url, { params, ..._object })
  }
  get3(url, params, _object = {}) {
    return this.service.get(url, { params, ..._object })
  }
  get4(url, params, _object = {}) {
    return this.service.get(url, { params, ..._object })
  }
  post(url, params, _object = {}) {
    // 当需要上传文件时，设置headers
    if (params instanceof FormData) {
      return this.service.post(url, params, {
        // headers: {
        //   'Content-Type': 'multipart/form-data'
        // }
      })
    }
    return this.service.post(url, params, _object)
  }
  put(url, params, _object = {}) {
    return this.service.put(url, params, _object)
  }
  delete(url, params, _object = {}) {
    return this.service.delete(url, { params, ..._object })
  }
  download(url, params, _object = {}) {
    return this.service.post(url, params, { ..._object, responseType: 'blob' })
  }
}

export default new RequestHttp(config)
